package com.knife.database.generate;


import com.knife.common.annotations.KnifeField;
import com.knife.common.utils.KnifeStringUtil;
import org.apache.commons.lang3.reflect.FieldUtils;

import javax.persistence.Transient;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;

/**
 * 根据业务给的文档，生成java属性
 *
 * @author： 76875
 * @date： 2022/7/22 星期五 17:09
 * @description：
 * @modifiedBy：
 * @version: 1.0
 */
public class JavaBeanGenerateTest {
    /**
     * 自动生成类属性，需根据文档上字段顺序是否匹配如下参数顺序再决定是否使用
     * <p>
     * 判断非必填
     * <p>
     * 参数顺序如下：
     * 1.属性名
     * 2.描述
     * 3.是否必填
     * 4.字段类型
     */

    public void initJavaBeanFieldWithNotNull() {
        /**
         * 支持解析的数据格式示例
         * billCode	收款单号	是	string
         * billDate	收款时间	是	date
         */
        String s = "billCode\t收款单号\t是\tstring\n" +
                "planId\t计划ID\t是\tstring\n";

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        String[] split = s.split("\n");
        trimOfStringArray(split);
        for (String s1 : split) {
            String[] split1 = s1.split("\t");
            System.out.println();
            boolean required = split1[2].equals("是");
            System.out.println("@PmsField(required = " + required + (", title = \"") + split1[1] + "\")");
            System.out.println("private " + covert(split1[3]) + " " + split1[0] + ";");
        }
    }

    private void trimOfStringArray(String[] split) {
        for (int i = 0; i < split.length; i++) {
            split[i] = split[i].trim();
        }
    }


    /**
     * 自动生成类属性，需根据文档上字段顺序是否匹配如下参数顺序再决定是否使用
     * <p>
     * 判断非必填，并且添加补充描述
     * <p>
     * 参数顺序如下：
     * 1.属性名
     * 2.描述
     * 3.是否必填
     * 4.字段类型
     * 5.字段补充描述
     */

    public void initJavaBeanField2() {
        /**
         * 支持解析的数据格式示例
         * contractLineNum	行号	是	integer
         * payNote	备注	否	string	补充描述
         */
        String s = "contractLineNum\t行号\t是\tinteger\t\n" +
                "payNote\t备注\t否\tstring\t补充描述\n";

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        String[] split = s.split("\n");
        for (String s1 : split) {
            String[] split1 = s1.split("\t");
            trimOfStringArray(split1);
            boolean required = split1[2].equals("是");
            System.out.println();
            if (split1.length > 4) {
                System.out.println("/**");
                System.out.println(" * " + split1[4]);
                System.out.println(" */");
            }
            System.out.println("@PmsField(required = " + required + (", title = \"") + split1[1] + "\")");
            System.out.println("private " + covert(split1[3]) + " " + split1[0] + ";");
        }
    }

    /**
     * 自动生成类属性，需根据文档上字段顺序是否匹配如下参数顺序再决定是否使用
     * <p>
     * 不用判断非必填
     * <p>
     * 参数顺序如下：
     * 1.属性名
     * 2.描述
     * 3.字段类型
     * 4.字段补充描述
     */

    public void initJavaBeanFieldWithoutNotNull() {
        /**
         * 支持解析的数据格式示例
         * oppositeCode	客户编码	string
         * isGrade	是否评级	string	补充描述
         */
        String s = "oppositeCode\t客户编码\tstring\t\n" +
                "isGrade\t是否评级\tstring\t补充描述\n";

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        String[] split = s.split("\n");
        for (String s1 : split) {
            String[] split1 = s1.split("\t");
            trimOfStringArray(split1);
            System.out.println();
            if (split1.length > 3) {
                System.out.println("@PmsField(required = " + false + (", title = \"") + split1[1] + ";" + split1[3] + "\")");
            } else {
                System.out.println("@PmsField(required = " + false + (", title = \"") + split1[1] + "\")");
            }
            System.out.println("private " + covert(split1[2]) + " " + split1[0] + ";");
        }
    }


    /**
     * 根据
     */

    public void createSetterWithPmsField() {
        // todo 指定生成属性列的类
        Class<?> aClass = Object.class;

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        List<Field> allFieldsList = FieldUtils.getAllFieldsList(aClass);
        String objName = Character.toLowerCase(aClass.getSimpleName().charAt(0)) + aClass.getSimpleName().substring(1);
        for (Field field : allFieldsList) {
            field.setAccessible(true);
            // 生成setter，并添加注释
            KnifeField annotation = field.getAnnotation(KnifeField.class);
            if (annotation == null) {
                continue;
            }
            String title = annotation.title();
            System.out.println("        // " + title);
            String setter = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
            System.out.println(objName + "." + setter + "(null);");
        }
    }


    public void createGetterWithPmsField() {
        // todo 指定生成属性列的类

        Class<?> aClass = Object.class;

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        List<Field> allFieldsList = FieldUtils.getAllFieldsList(aClass);
        String objName = Character.toLowerCase(aClass.getSimpleName().charAt(0)) + aClass.getSimpleName().substring(1);
        for (Field field : allFieldsList) {
            field.setAccessible(true);
            // 生成setter，并添加注释
            KnifeField annotation = field.getAnnotation(KnifeField.class);
            if (annotation == null) {
                continue;
            }
            String title = annotation.title();
            System.out.println("        // " + title);
            String getter = "get" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
            System.out.println(field.getType().getSimpleName() + " " + field.getName() + " = " + objName + "." + getter + "();");
        }
    }

    /**
     * 根据类生成属性常量
     */

    public void generatePublicStaticField() {
        // todo 指定生成属性列的类
        Class<?> createClass = Object.class;

        // ----------------------------------------------------
        // 以下代码无需修改
        // ----------------------------------------------------

        Field[] declaredFields = createClass.getDeclaredFields();
        for (Field field : declaredFields) {
            if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) {

            } else if (field.isAnnotationPresent(Transient.class)) {

            } else {
                String name = field.getName();
                String s = KnifeStringUtil.camelhumpToUnderline(name);
                System.out.println("public static final String FIELD_" + s + " = " + "\"" + name + "\"" + ";");
            }
        }
    }

    private String covert(String contractTypeField) {
        if ("string".equalsIgnoreCase(contractTypeField)) {
            return "String";
        } else if ("date".equalsIgnoreCase(contractTypeField)) {
            return "Date";
        } else if ("double".equalsIgnoreCase(contractTypeField)) {
            return "BigDecimal";
        } else if ("decimal".equalsIgnoreCase(contractTypeField)) {
            return "BigDecimal";
        } else if ("integer".equalsIgnoreCase(contractTypeField)) {
            return "Integer";
        } else {
            return "String";
        }
    }

}
